package util;

import generated.EnvT;
import generated.EnvT.Articulos.ArticuloAEnviar;
import generated.NuevoArt;
import generated.NuevoArt.Accesorio;
import generated.NuevoArt.Ropa;
import generated.RepAF;
import generated.RepAF.Articulos.ArticuloFabrica;
import generated.SolDist;
import generated.SolDist.Envio;
import generated.SolDist.Envio.Articulos;
import generated.SolFab;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import bean.Articulo;

public class XMLReader {

	private static XMLReader instance = null;
	static Logger logger = Logger.getLogger(XMLReader.class);
	
	private XMLReader() {

	}

	public static XMLReader getInstance() {
		if (instance == null) {
			instance = new XMLReader();
		}
		return instance;
	}

	public Articulo leerNuevoArt() {
		try {
//			ClassLoader cl = XMLReader.class.getClassLoader();
//			InputStream xml = cl.getResourceAsStream("util/nuevoArt.xml");
			String path = System.getProperty("user.home");
			InputStream xml = new FileInputStream(path+"/nuevoArt.xml");
			System.out.println("User Home: "+path+"################################");
			
			JAXBContext jc = JAXBContext.newInstance("generated");
			Unmarshaller unmarshaller = jc.createUnmarshaller();
			
			NuevoArt nuevoArt = (NuevoArt) unmarshaller.unmarshal(xml);

			Ropa ropa = nuevoArt.getRopa();
			bean.Ropa art = null;
			if (ropa != null) {
				art = new bean.Ropa();
				System.out.println("Nuevo Articulo: Ropa");
				System.out.println("Referencia: " + ropa.getRef());
				art.setReferencia(ropa.getRef());
				System.out.println("Linea: " + ropa.getLinea());
				art.setLinea(ropa.getLinea());
				System.out.println("Descripcion: " + ropa.getDescripcion());
				art.setDescripcion(ropa.getDescripcion());
				System.out.println("Talle: " + ropa.getTalle());
				art.setTalle(ropa.getTalle());
				System.out.println("Color: " + ropa.getColor());
				art.setColor(ropa.getColor());
				System.out.println("Seccion: " + ropa.getSeccion());
				art.setSeccion(ropa.getSeccion());
				System.out.println("Precio: " + ropa.getPrecio());
				art.setPreciovu(ropa.getPrecio());
				System.out.println("Origen: " + ropa.getOrigen());
				art.setOrigen(ropa.getOrigen());
				
				logger.log(Level.ERROR, "Articulo Nuevo Leido");
				return art;
			}

			Accesorio accesorio = nuevoArt.getAccesorio();
			bean.Accesorio art2 = null;
			if (accesorio != null) {
				art2 = new bean.Accesorio();
				System.out.println("Nuevo Articulo: Accesorio");
				System.out.println("Referencia: " + accesorio.getRef());
				art2.setReferencia(accesorio.getRef());
				System.out.println("Linea: " + accesorio.getSeccion());
				art2.setSeccion(accesorio.getSeccion());
				System.out.println("Descripcion: " + accesorio.getNombre());
				art2.setNombre(accesorio.getNombre());
				System.out.println("Talle: " + accesorio.getDescripcion());
				art2.setDescripcion(accesorio.getDescripcion());
				System.out.println("Color: " + accesorio.getComposicion());
				art2.setComposicion(accesorio.getComposicion());
				System.out.println("Seccion: " + accesorio.getMedidas());
				art2.setMedidas(accesorio.getMedidas());
				System.out.println("Precio: " + accesorio.getPrecio());
				art2.setPreciovu(accesorio.getPrecio());
				System.out.println("Origen: " + accesorio.getColor());
				art2.setColor(accesorio.getColor());
				System.out.println("Origen: " + accesorio.getCategoria());
				art2.setCategoria(accesorio.getCategoria());
				System.out.println("Origen: " + accesorio.getLinea());
				art2.setLinea(accesorio.getLinea());
				
				logger.log(Level.ERROR, "Articulo Nuevo Leido");
				
				return art2;
			}

		} catch (JAXBException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Error en el XML", e);
		} catch (FileNotFoundException e) {
			logger.log(Level.ERROR, "Archivo no encontrado", e);
			e.printStackTrace();
		}
		return null;

	}

	public void leerSolFabr() {
		try {
//			ClassLoader cl = XMLReader.class.getClassLoader();
//			InputStream xml = cl.getResourceAsStream("util/SolFabr.xml");
			String path = System.getProperty("user.home");
			InputStream xml = new FileInputStream(path+"/SolFabr.xml");
			JAXBContext jc = JAXBContext.newInstance("generated");
			Unmarshaller unmarshaller = jc.createUnmarshaller();
			SolFab solFabr = (SolFab) unmarshaller.unmarshal(xml);

			System.out.println("Numero de Sol. Fab: " + solFabr.getNumSolFab());
			System.out.println("Id Centro: " + solFabr.getIdCentro());
			System.out.println("Id Fabrica: " + solFabr.getIdFabrica());
			List<generated.SolFab.Articulos.ArticuloFabrica> articulos = solFabr
					.getArticulos().getArticuloFabrica();
			System.out.println("Cantidad de articulos: " + articulos.size());
			int i = 1;
			for (generated.SolFab.Articulos.ArticuloFabrica a : articulos) {
				System.out.println("Articulo numero :" + i);
				System.out.println("		Referencia: " + a.getRef());
				System.out.println("		Cantidad:" + a.getCant());
				i++;
			}

		} catch (JAXBException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Error en el XML", e);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Archivo no encontrado", e);
		}

	}

	public RepAF leerRepAF() {
		RepAF repAF = null;
		try {
//			ClassLoader cl = XMLReader.class.getClassLoader();
//			InputStream xml = cl.getResourceAsStream("util/RepAF.xml");
			String path = System.getProperty("user.home");
			InputStream xml = new FileInputStream(path+"/RepAF.xml");
			JAXBContext jc = JAXBContext.newInstance("generated");
			Unmarshaller unmarshaller = jc.createUnmarshaller();
			repAF = (RepAF) unmarshaller.unmarshal(xml);

			System.out.println("Numero de RepAF: " + repAF.getNumRepAF());
			System.out.println("Id Fabrica: " + repAF.getIdFabrica());
			System.out.println("Id Centro: " + repAF.getIdCentro());
			System.out.println("Numero de Sol. Fab: " + repAF.getNumSolFab());
			List<ArticuloFabrica> articulos = repAF.getArticulos()
					.getArticuloFabrica();
			System.out.println("Cantidad de articulos: " + articulos.size());
			int i = 1;
			for (ArticuloFabrica a : articulos) {
				System.out.println("Articulo numero :" + i);
				System.out.println("		Referencia: " + a.getRef());
				System.out.println("		Cantidad:" + a.getCant());
				i++;
			}

		} catch (JAXBException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Error en el XML", e);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Archivo no encontrado", e);
		}
		return repAF;

	}

	public void leerEnvT() {
		try {
//			ClassLoader cl = XMLReader.class.getClassLoader();
//			InputStream xml = cl.getResourceAsStream("util/EnvT.xml");
			String path = System.getProperty("user.home");
			InputStream xml = new FileInputStream(path+"/EnvT.xml");
			JAXBContext jc = JAXBContext.newInstance("generated");
			Unmarshaller unmarshaller = jc.createUnmarshaller();
			EnvT envT = (EnvT) unmarshaller.unmarshal(xml);

			System.out.println("Numero de envio: " + envT.getNumEnvT());
			System.out.println("Id Centro: " + envT.getIdCentro());
			System.out.println("Id Tienda: " + envT.getIdTienda());
			System.out.println("Numero de Sol. Dist: " + envT.getNumSolDist());
			System.out.println("Numero de Palc: " + envT.getNumPalc());
			List<ArticuloAEnviar> articulos = envT.getArticulos()
					.getArticuloAEnviar();
			System.out.println("Cantidad de articulos a enviar: "
					+ articulos.size());
			int i = 1;
			for (ArticuloAEnviar a : articulos) {
				System.out.println("Articulo numero :" + i);
				System.out.println("		Referencia: " + a.getRef());
				System.out.println("		Cantidad:" + a.getCant());
				i++;
			}

		} catch (JAXBException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Error en el XML", e);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Archivo no encontrado", e);
		}
	}

	public SolDist leerSolDist() {
		SolDist solDist = null;
		try {

//			ClassLoader cl = XMLReader.class.getClassLoader();
//			InputStream xml = cl.getResourceAsStream("util/SolDist.xml");
			String path = System.getProperty("user.home");
			InputStream xml = new FileInputStream(path+"/SolDist.xml");
			JAXBContext jc = JAXBContext.newInstance("generated");
			Unmarshaller unmarshaller = jc.createUnmarshaller();

			solDist = (SolDist) unmarshaller.unmarshal(xml);
			System.out.println("Sol Dist numero: " + solDist.getNumSolDist());
			List<Envio> envios = solDist.getEnvio();
			System.out.println("Cantidad de envios: " + envios.size());
			int i = 1;
			for (Envio e : envios) {
				System.out.println("----------------------------------------");
				System.out.println("	Envio numero: " + i);
				System.out.println("	Tienda: " + e.getIdTienda());
				i++;
				List<Articulos> articulos = e.getArticulos();
				System.out.println("	Cantidad de articulos: "
						+ articulos.size());
				for (Articulos a : articulos) {
					System.out.println("		Referencia: " + a.getRef());
					System.out.println("		Cantidad:" + a.getCant());
				}
			}

		} catch (JAXBException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Error en el XML", e);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			logger.log(Level.ERROR, "Archivo no encontrado", e);
		}
		return solDist;
	}

	public static void main(String[] args) {
		XMLReader x = new XMLReader();
		System.out.println("##############################################");
		x.leerSolDist();
		System.out.println("##############################################");
		x.leerEnvT();
		System.out.println("##############################################");
		x.leerRepAF();
		System.out.println("##############################################");
		x.leerSolFabr();
		System.out.println("##############################################");
		x.leerNuevoArt();
		System.out.println("##############################################");
		bean.Ropa a = (bean.Ropa) x.leerNuevoArt();
		System.out.println(a.getColor());

	}

}
